// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COMM_API_H
#define COMM_API_H

#include <cstdint>
#include "Include/msghead.h"

typedef uint32_t (*RENDER_SERVER_HANDLE_HOOK)(uint8_t *data, uint32_t length);

enum VmiInstructionEngineRetCode : uint32_t {
    VMI_SUCCESS0 = 0,
    VMI_INSTRUCTION_ENGINE_INVALID_PARAM = 1,
    VMI_INSTRUCTION_ENGINE_UNINIT_SOCK = 2,
    VMI_INSTRUCTION_ENGINE_SEND_ALLOC_FAILED = 3,
    VMI_INSTRUCTION_ENGINE_SEND_MEMSET_FAILED = 4,
    VMI_INSTRUCTION_ENGINE_SEND_MEMCPY_FAILED = 5,
    VMI_INSTRUCTION_ENGINE_SEND_FAIL = 6,
    VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL = 7,
    VMI_INSTRUCTION_CLIENT_INVALID_PARAM = 0x0A050001,
    VMI_INSTRUCTION_CLIENT_START_FAIL = 0x0A050002,
    VMI_INSTRUCTION_CLIENT_ALREADY_STARTED = 0x0A050003,
    VMI_INSTRUCTION_CLIENT_STOP_FAIL = 0x0A050004,
    VMI_INSTRUCTION_CLIENT_SEND_HOOK_REGISTER_FAIL = 0x0A050005,
    VMI_INSTRUCTION_CLIENT_SEND_FAIL = 0x0A050006,
    VMI_INSTRUCTION_CLIENT_SEND_AGAIN = 0x0A050007
};

#if defined (__cplusplus)
extern "C" {
#endif

/**
 * @功能描述：注册GL指令的数据处理钩子函数（只在客户端用）
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterGLDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册视频数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterVideoDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册音频数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterAudioDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册录音数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterRecorderDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册触控输入数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterTouchInputDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册输入法数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterImeDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册传感器数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterSensorDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册GPS数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterGpsDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册屏幕旋转方向数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterOrientationDataHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册VideoStreamH264数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterVideoStreamH264HandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册VideoEncodeStatistics数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterVideoStreamEncodeStatisticsHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册游戏控制数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterGameControlHandleHook(RENDER_SERVER_HANDLE_HOOK hook);
/**
 * @功能描述：注册RPC数据处理钩子函数
 * @参数 [in] hook：钩子函数地址
 * @返回值：成功返回VMI_SUCCESS，失败返回VMI_INSTRUCTION_ENGINE_HOOK_REGISTER_FAIL
 */
uint32_t RegisterRPCHandleHook(RENDER_SERVER_HANDLE_HOOK hook);

/**
 * @功能描述：发送GL指令数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendGLData(uint8_t *data, size_t length);
/**
 * @功能描述：发送视频数据（过场动画）
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendVideoData(uint8_t *data, size_t length);
/**
 * @功能描述：发送音频数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendAudioData(uint8_t *data, size_t length);
/**
 * @功能描述：发送录音数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendRecorderData(uint8_t *data, size_t length);
/**
 * @功能描述：发送触控输入数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendTouchInputData(uint8_t *data, size_t length);
/**
 * @功能描述：发送输入法数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendIMEData(uint8_t *data, size_t length);
/**
 * @功能描述：发送传感器数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendSensorData(uint8_t *data, size_t length);
/**
 * @功能描述：发送GPS数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendGpsData(uint8_t *data, size_t length);
/**
 * @功能描述：发送屏幕旋转方向数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendOrientationData(uint8_t *data, size_t length);
/**
 * @功能描述：发送游戏控制数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendGameControlData(uint8_t *data, size_t length);
/**
 * @功能描述：发送RPC数据
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendRPCData(uint8_t *data, size_t length);
/**
 * @功能描述：发送编码模式和编码参数
 * @参数 [in] data：数据的地址
 * @参数 [in] length：数据的大小
 * @返回值：成功返回VMI_SUCCESS，失败返回错误码
 */
uint32_t SendCloudPhoneEncoderConf(uint8_t *data, size_t length);

#if defined (__cplusplus)
}
#endif

#endif
